<?php
class Prod_adjuntos extends MY_Controller {

	var $ruta_adjuntos = './documentos/adj_productos/';

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'Prod_adjunto');

    	$this->title = 'Productos :: Adjuntos Producto';
		$this->CARPETA_VISTAS = 'productos/parametros/';
		$this->nombre_entidad = 'Adjunto de Producto';
		$this->nombre_entidad_plural = 'Adjuntos de Productos';

		$this->pagina_editar = $this->CARPETA_VISTAS . 'adjunto_edit_view';
		$this->pagina_ver = $this->CARPETA_VISTAS . 'adjunto_ver_todos_view';

		$this->exportarExcelPermitido = FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
	 * partir del formulario recibido a través de POST.	*/
	protected function getObjetoDesdeForm()
	{
		$idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		
		$objEntidad = $this->getObjeto($idEntidad);
		$objEntidad->nombre = $this->input->post('txt_nombre');
        $objEntidad->descripcion = $this->input->post('txt_descripcion');

		$id_prod = is_numeric($this->input->post('txt_producto')) ? $this->input->post('txt_producto') : NULL;

		$datos['objEntidad'] = $objEntidad;
		$datos['objRelacionados'] = array(new Prod_producto($id_prod));

		return $datos;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
		if(isset($dataView['id_producto'])){
			$objEntidad = $this->getObjeto();
			$objEntidad->where('prod_producto_id', $dataView['id_producto']);
			$dataView['listado'] = $objEntidad->get_iterated();
		}
		
		return $dataView;
	}


	/* Método para cargar los formularios de creación y actualización de la información de los registros. */
	public function editar($id_producto)
	{
		$dataView['objEntidad'] = $this->getObjeto();
		$dataView['id_producto'] = $id_producto;

		$objProd = new Prod_producto($id_producto);

		# Datos requeridos por las vistas
		$dataView['title'] = 'Adjuntos del Producto: ' . strtoupper($objProd->nombre);
		$controlador = strtolower($this->nombre_controlador);
		$dataView['nombre_controlador'] = $controlador;
		$dataView['metodo_guardar'] = 'subir_archivo';
		$dataView['metodo_ver_todos'] = '';
		$dataView['metodo_subir_archivo'] = "cargarArchivo_adjunto(this.form.id, '$controlador')";
		
		$dataView = $this->cargarDatosRelacionados($dataView);
		parent::_loadFileUploadView($dataView, FALSE);
	}

	public function subir_archivo()
	{
		$config['upload_path'] = $this->ruta_adjuntos;
		$config['allowed_types'] = 'gif|jpg|jpge|png|doc|docx|xls|xlsx|pdf|txt';
		
		$this->load->library('upload', $config);
		if (!$this->upload->do_upload()) 
			$dataView['error'] = $this->upload->display_errors();
		else {
			$dataView = $this->getObjetoDesdeForm();
			$datos_archivo = $this->upload->data();
			$dataView['objEntidad']->path = $datos_archivo['file_name'];

			$dataView = parent::guardarEntidad($dataView);
		}

		$dataView['id_producto'] = $this->input->post('txt_producto');
		$dataView = $this->cargarDatosRelacionados($dataView);
		$dataView['nombre_controlador'] = strtolower($this->nombre_controlador);

		parent::_loadViews($this->pagina_ver, $dataView, FALSE);
	}


	public function eliminar($id_elemento)
	{
		$dataView['title'] = 'Borrar elemento';
		$dataView['error'] = '';

		# Se obtiene el objeto que se desea eliminar
		$objEntidad = $this->getObjeto($id_elemento);
		$id_producto = $objEntidad->prod_producto_id;

		if($this->validarEliminacion($id_elemento))
		{
			$path_archivo = $this->ruta_adjuntos . trim($objEntidad->path);

			# Se manejan transacciones para interactuar con la BD
			$objEntidad->trans_begin();
			$objEntidad->delete();
			if ($objEntidad->trans_status() === FALSE) { # Se chequea el estado de la transacción. Si falló, hago un rollback
			    $objEntidad->trans_rollback(); 
			    $dataView['error'] .= $objEntidad->error->string;
			}
			else { 
				# Transacción exitosa, trato de borrar el archivo del servidor
				if (file_exists($path_archivo)) {
					$borrado = unlink($path_archivo);
					if($borrado){
						$objEntidad->trans_commit();
					}
					else {
						$dataView['error'] = 'Ocurrió un error al intentar borrar el archivo del servidor. </br>' . $objEntidad->error->string;
						$objEntidad->trans_rollback();
					}
				}
				else $objEntidad->trans_commit();
			}
		}
		else $dataView['error'] = 'No se puede eliminar el elemento elegido.';

		$dataView['id_producto'] = $id_producto;
		$dataView = $this->cargarDatosRelacionados($dataView);
		$dataView['nombre_controlador'] = strtolower($this->nombre_controlador);

		parent::_loadViews($this->pagina_ver, $dataView, FALSE);
	}


	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		return TRUE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		return TRUE;
	}
}